using System;
using System.Collections.Generic;
using System.Text;
using nDeveloper.BO.Base;
using nDeveloper.BO.Base.Domain;
using nDeveloper.BO.Base.Config;

namespace nDeveloper.BO.Base.Sql
{
    public class DbType
    {
        private Constants.vsDataBase DataBase;

        public DbType()
        {
            // construtor
            DataBase = DataBaseConfig.GetServerType();           
        }

        public string GetSqlType(string TypeName, string Size)
        {
            string retorno = "";
            if ((DataBase == Constants.vsDataBase.SQLServer2000) || (DataBase == Constants.vsDataBase.SQLServer2005))
            {
                switch(TypeName) {
                    case "Integer":
                        retorno = "INT";
                        break;
                    case "BigInt":
                        retorno = "BIGINT";
                        break;
                    case "Float":
                        retorno = "FLOAT";
                        break;
                    case "Varchar":
                        retorno = "NVARCHAR(" + Size + ")";
                        break;
                    case "Char":
                        retorno = "CHAR(" + Size + ")";
                        break;
                    case "Bit":
                        retorno = "BIT";
                        break;
                    case "SmallInt" :
                        retorno = "SMALLINT";
                        break;
                    case "Money" :
                        retorno = "MONEY";
                        break;
                    case "Date":
                        retorno = "DATETIME";
                        break;
                    case "Time":
                        retorno = "DATETIME";
                        break;
                    case "TimeStamp":
                        retorno = "TIMESTAMP";
                        break;
                    case "BlobText":
                        retorno = "Text";
                        break;
                    case "BlobBinary":
                        retorno = "Image";
                        break;
                }
            }
            else if (DataBase == Constants.vsDataBase.SQLServerEverywhere)
            {
                switch (TypeName)
                {
                    case "Integer":
                        retorno = "INT";
                        break;
                    case "BigInt":
                        retorno = "BIGINT";
                        break;
                    case "Float":
                        retorno = "FLOAT";
                        break;
                    case "Varchar":
                        retorno = "NVARCHAR(" + Size + ")";
                        break;
                    case "Char":
                        retorno = "CHAR(" + Size + ")";
                        break;
                    case "Bit":
                        retorno = "BIT";
                        break;
                    case "SmallInt":
                        retorno = "SMALLINT";
                        break;
                    case "Money":
                        retorno = "MONEY";
                        break;
                    case "Date":
                        retorno = "DATETIME";
                        break;
                    case "Time":
                        retorno = "DATETIME";
                        break;
                    case "TimeStamp":
                        retorno = "BIGINT";
                        break;
                    case "BlobText":
                        retorno = "NText";
                        break;
                    case "BlobBinary":
                        retorno = "Image";
                        break;
                }
            }
            else if (DataBase == Constants.vsDataBase.MySQL)
            {
                switch (TypeName)
                {
                    case "Integer":
                        retorno = "INT";
                        break;
                    case "BigInt":
                        retorno = "BIGINT";
                        break;
                    case "Float":
                        retorno = "FLOAT";
                        break;
                    case "Varchar":
                        retorno = "VARCHAR(" + Size + ")";
                        break;
                    case "Char":
                        retorno = "CHAR(" + Size + ")";
                        break;
                    case "Bit":
                        retorno = "TINYINT(1)";
                        break;
                    case "SmallInt":
                        retorno = "SMALLINT";
                        break;
                    case "Money":
                        retorno = "DECIMAL";
                        break;
                    case "Date":
                        retorno = "DATETIME";
                        break;
                    case "Time":
                        retorno = "DATETIME";
                        break;
                    case "TimeStamp":
                        retorno = "TIMESTAMP";
                        break;
                    case "BlobText":
                        retorno = "Text";
                        break;
                    case "BlobBinary":
                        retorno = "MEDIUMBLOB";
                        break;
                }
            }
            else if (DataBase == Constants.vsDataBase.Firebird)
            {
                switch (TypeName)
                {
                    case "Integer":
                        retorno = "INTEGER";
                        break;
                    case "BigInt":
                        retorno = "BIGINT";
                        break;
                    case "Float":
                        retorno = "DOUBLE PRECISION";
                        break;
                    case "Varchar":
                        retorno = "VARCHAR(" + Size + ")";
                        break;
                    case "Char":
                        retorno = "CHAR(" + Size + ")";
                        break;
                    case "Bit":
                    case "SmallInt":
                        retorno = "SMALLINT";
                        break;
                    case "Money":
                        retorno = "DECIMAL";
                        break;
                    case "Date":
                        retorno = "DATE";
                        break;
                    case "Time":
                        retorno = "TIME";
                        break;
                    case "TimeStamp":
                        retorno = "TIMESTAMP";
                        break;
                    case "BlobText":
                        retorno = "BLOB SUB_TYPE TEXT";
                        break;
                    case "BlobBinary":
                        retorno = "BLOB";
                        break;
                }
            }
            else if (DataBase == Constants.vsDataBase.PostgreSQL)
            {
                switch (TypeName)
                {
                    case "Integer":
                        retorno = "int4";
                        break;
                    case "BigInt":
                        retorno = "int8";
                        break;
                    case "Float":
                        retorno = "float8";
                        break;
                    case "Varchar":
                        retorno = "varchar(" + Size + ")";
                        break;
                    case "Char":
                        retorno = "char(" + Size + ")";
                        break;
                    case "Bit":
                        retorno = "bit";
                        break;
                    case "SmallInt":
                        retorno = "int2";
                        break;
                    case "Money":
                        retorno = "numeric";
                        break;
                    case "Date":
                        retorno = "date";
                        break;
                    case "Time":
                        retorno = "time";
                        break;
                    case "TimeStamp":
                        retorno = "timestamp";
                        break;
                    case "BlobText":
                        retorno = "text";
                        break;
                    case "BlobBinary":
                        retorno = "bytea";
                        break;
                }
            }
            else if (DataBase == Constants.vsDataBase.Oracle)
            {
                switch (TypeName)
                {
                    case "Integer":
                        retorno = "integer";
                        break;
                    case "BigInt":
                        retorno = "double precision";
                        break;
                    case "Float":
                        retorno = "float";
                        break;
                    case "Varchar":
                        retorno = "varchar2(" + Size + ")";
                        break;
                    case "Char":
                        retorno = "char(" + Size + ")";
                        break;
                    case "Bit":
                        retorno = "int";
                        break;
                    case "SmallInt":
                        retorno = "smallint";
                        break;
                    case "Money":
                        retorno = "decimal";
                        break;
                    case "Date":
                        retorno = "date";
                        break;
                    case "Time":
                        retorno = "date";
                        break;
                    case "TimeStamp":
                        retorno = "timestamp";
                        break;
                    case "BlobText":
                        retorno = "long";
                        break;
                    case "BlobBinary":
                        retorno = "blob";
                        break;
                }
            }
            return retorno;
        }
    }
}
